/**
 * 
 */
package baduga.client;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.UnknownHostException;


/** SSL libs*/
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

import baduga.core.Core_Network_Api;

/**
 * @author Janek
 *
 */
public class  Network_Api extends Core_Network_Api {

	/** Informacja czy klient jest połączony */
	private static boolean conected = false;
	
	/** Factor SSL */
	private static SSLSocketFactory factorySSL = (SSLSocketFactory) SSLSocketFactory.getDefault();
	
	/** Socket SSL dla klienta */
	private static SSLSocket socketSSL;
	
	/** Auto Zamykanie połączenia */
	private static boolean autoClose = false;
	
	/** Katalog Certyfikatu */
	private static String dirCert = "/Certs";
	
	/** Bufory */
	private static BufferedReader 	inboundData;
	private static PrintWriter 		outboundData; 
	
	
	/** Tablica kodów błędów */
	
	
	
	Network_Api()
	{
		setSSLProperties();
	}
	
	
	
	/**
	 * Funkcja ustala własności połączenia over SSL
	 */
	public final void setSSLProperties()
	{
		//TODO:Temporary
		String pathToKeyStore = "";
		
		System.setProperty("javax.net.ssl.keyStoreType", 	"pkcs12");
		System.setProperty("javax.net.ssl.trustStoreType", 	"jks");
		System.setProperty("javax.net.ssl.keyStore", pathToKeyStore);
		System.setProperty("javax.net.ssl.trustStore", pathToKeyStore);
		System.setProperty("javax.net.debug", "ssl");
		System.setProperty("javax.net.ssl.keyStorePassword", pathToKeyStore);
		System.setProperty("javax.net.ssl.trustStorePassword", pathToKeyStore);
	}
	
	
	
	/**
	 * Funkcja wykonuje połączenie z serwerem.
	 * Jeżeli się powiedzi zwraca sukces.
	 * 
	 * @param hostname
	 * @param port
	 * @return
	 */
	public boolean connect(String hostname, int port)
	{
		if(!conected)
			try {
				socketSSL = (SSLSocket) factorySSL.createSocket(hostname, port);
				inboundData = new BufferedReader(new InputStreamReader(socketSSL.getInputStream()));
				outboundData = new PrintWriter(socketSSL.getOutputStream(), true);
				conected = true;
			} catch (UnknownHostException e1) {
				// NieznanyHost
				
				e1.printStackTrace();
			} catch (IOException e1) {
				// Błąd IO
				
				e1.printStackTrace();
			}


		
		return conected;
		
	}
	
	/**
	 * Funkcja rozłącza połączenie z serwerem.
	 * Zwraca sukces jeśli nic po drodze się nie stało.
	 * 
	 * @return
	 */
	public boolean disconnect()
	{
		
		
		if(conected)
		{
			boolean opStatus = true;
			
			try {
				socketSSL.close();
			} catch (IOException e) {
				// Błąd IO
				
				e.printStackTrace();
				opStatus = false;
			}
			
			return opStatus;
		}
		else
			return false;
		
		
	}
	
	
	
	
	/**
	 * Zwraca informację do klasy wywołującej czy połączenie istnieje.
	 * @return
	 */
	public static boolean isConnected()
	{
		return conected;
	}
	
}